/*
 * DefinicionesComunes.h
 *
 *  Created on: Oct 15, 2013
 *      Author: m
 */

#ifndef DEFINICIONES_COMUNES_H_
#define DEFINICIONES_COMUNES_H_

#include <iostream>
#include <sstream>
#include <list>
#include <cstring>

#define IPC_BASE_FILE         "ej3_ipcs"
#define SHM_CONT_EQUIPAJE     'a'
#define SHM_CONT_SOSPECHOSO   'b'
#define MUTEX_CONT_EQUIPAJE   'c'
#define MUTEX_CONT_SOSPECHOSO 'd'
#define MQ_SIN_VERIF          'e'
#define MQ_SOSPECHOSO         'f'
#define MQ_VERIFICADO         'g'
#define MQ_NOTIFICACIONES     'h'
#define SEQ_ID_PASAJERO       'i'
#define SEQ_ID_EST_VERIF      'j'
#define SEQ_ID_ROBOT          'k'

#define MTYPE_NOTIFICACIONES 1

#define EQUIPAJE_MAX_DATA 1024*1

typedef int IdPasajero;
typedef int IdVuelo;
typedef std::list< std::string > Equipaje;

struct MensajeEquipaje
{
private:
    int m_vuelo;
    char m_data[EQUIPAJE_MAX_DATA];

public:

    MensajeEquipaje() : m_vuelo(0)
    {
        memset( m_data, '\0', EQUIPAJE_MAX_DATA );
    }

    MensajeEquipaje( const MensajeEquipaje &other )
    {
        *this = other;
    }

    void setVuelo( int vuelo )
    {
        this->m_vuelo = vuelo;
    }

    int getVuelo()
    {
        return m_vuelo;
    }

    /*
     * Setea el contenido del equipaje
     * Nota: Si el contenido es mayor a la capacidad permitida este será
     *        truncado hasta el elemento anterior a superar la capacidad
     *        (debería tirar una excepción o hacer algo más prolijo,
     *         pero por ahora se deja así)
     */
    void setContenido( Equipaje contenido )
    {
        std::stringstream ss;
        int contadorBytes = 0;

        for ( Equipaje::iterator it = contenido.begin();
                it != contenido.end(); it++ )
        {
            contadorBytes += it->length() + 1;

            if ( contadorBytes < EQUIPAJE_MAX_DATA )
            {
                ss << *it << std::endl;
            }
        }

        memcpy( m_data, ss.str().c_str(), ss.str().length() );
        m_data[ ss.str().length() ] = '\0';
    }

    Equipaje getContenido()
    {
        std::string buffer;
        std::stringstream ss;
        Equipaje contenido;


        ss << m_data;

        while( getline( ss, buffer ) )
        {
            contenido.push_back( buffer );
        }

        return contenido;
    }

    MensajeEquipaje& operator=( const MensajeEquipaje& rhs )
    {
        this->m_vuelo = rhs.m_vuelo;
        memcpy( this->m_data, rhs.m_data, EQUIPAJE_MAX_DATA );

        return *this;
    }
};

#endif /* DEFINICIONES_COMUNES_H_ */
